SGDT    QWORD PTR DST
    SIDT    QWORD PTR DST
    SMSW    DST
    CLTS
    HLT
    LGDT    QWORD PTR SRC
    LIDT    QWORD PTR SRC
    LMSW    DST
    MOV     DST,SRC
    LLDT    SRC
    SLDT    DST
    LTR     SRC
    STR     DST
    ARPL    OPRD1,OPRD2
    LAR     OPRD1,OPRD2
    LSL     OPRD1,OPRD2
    VERR    OPRD
    VERW    OPRD
;名称:ASM8.ASM
;功能:显示关键寄存器内容及说明操作系统类指令的使用
;编译:TASM ASM8.ASM
;连接:TLINK ASM8.OBJ
;----------------------------------------------------------------------------
INCLUDE         386SCD.INC
;----------------------------------------------------------------------------
GDTSeg          SEGMENT PARA USE16                ;全局描述符表数据段(16位)
;----------------------------------------------------------------------------
GDT             LABEL   BYTE
                ;空描述符
DUMMY           Desc    <>
                ;规范段描述符及选择子
Normal          Desc    <0ffffh,,,ATDW,,>
Normal_Sel      =       Normal-GDT
;----------------------------------------------------------------------------
EFFGDT          LABEL   BYTE
                ;临时任务代码段描述符及选择子
TempCode        Desc    <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel    =       TempCode-GDT
                ;缓冲区段描述符及选择子
Buffer          Desc    <BufferLen-1,BufferSeg,,ATDW,,>
Buffer_Sel      =       Buffer-GDT
                ;测试描述符1及选择子
Test1           Desc    <1111h,,,92h,87h,>
Test1_Sel       =       Test1-GDT
TestR_Sel       =       Test1-GDT+RPL3
                ;测试描述符2及选择子
Test2           Desc    <2222h,,,82h,17h,>
Test2_Sel       =       Test1-GDT
;----------------------------------------------------------------------------
GDNum           =       ($-EFFGDT)/(SIZE Desc)    ;需特殊处理的描述符数
GDTLen          =       $-GDT                     ;全局描述符表长度
;----------------------------------------------------------------------------
GDTSeg          ENDS                              ;全局描述符表段定义结束
;----------------------------------------------------------------------------
BufferSeg       SEGMENT PARA USE16                ;缓冲区数据段
;----------------------------------------------------------------------------
GDTR_V          PDesc   <>                        ;存放GDTR
IDTR_V          PDesc   <>                        ;存放IDTR
;----------------------------------------------------------------------------
MSW_V           DW      0                         ;存放机器状态字
LDTR_V          DW      0                         ;存放LDTR选择子
TR_V            DW      0                         ;存放TR选择子
CR0_V           DD      0                         ;存放控制寄存器CR0
CR3_V           DD      0                         ;存放控制寄存器CR3
DR7_V           DD      0                         ;存放调试寄存器DR7
Test_RPL        DW      0
;----------------------------------------------------------------------------
Test1_SLD       DD      0                         ;演示用变量
Test1_ARD       DD      0
Test1_SLW       DW      0
Test1_ARW       DW      0
Test1_RF        DW      0
Test1_WF        DW      0
;----------------------------------------------------------------------------
Test2_SLD       DD      0                         ;演示用变量
Test2_ARD       DD      0
Test2_SLW       DW      0
Test2_ARW       DW      0
Test2_RF        DW      0
Test2_WF        DW      0
;----------------------------------------------------------------------------
BufferLen       =       $
BufferSeg       ENDS
;----------------------------------------------------------------------------
TempCodeSeg     SEGMENT PARA USE16                ;临时代码段
                ASSUME  CS:TempCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
Virtual         PROC    FAR
                mov     ax,Buffer_Sel
                mov     ds,ax
                mov     eax,cr0                   ;存储CR0
                mov     CR0_V,eax
                mov     eax,cr3                   ;存储CR3
                mov     CR3_V,eax
                mov     eax,DR7                   ;存储DR7
                mov     DR7_V,eax
                str     TR_V                      ;存储TR
                sldt    LDTR_V                    ;存储LDTR
                mov     Test_RPL,Test1_Sel
                mov     ax,TestR_Sel
                arpl    Test_RPL,ax               ;说明调整申请特权及指令
                mov     bx,0
                mov     ax,Test1_Sel
Lab1:           mov     edx,0
                mov     cx,0
                lsl     edx,eax                   ;说明装载段界限指令
                lsl     cx,ax
                mov     Test1_SLD[bx],edx
                mov     Test1_SLW[bx],cx
                mov     edx,0
                mov     cx,0
                lar     edx,eax                   ;说明装载存取权指令
                lar     cx,ax
                mov     Test1_ARD[bx],edx
                mov     Test1_ARW[bx],cx
                mov     Test1_RF[bx],0
                verr    ax                        ;说明读检验指令
                jnz     Lab2
                mov     Test1_RF[bx],1
Lab2:           mov     Test1_WF[bx],0
                verw    ax                        ;说明写检验指令
                jnz     Lab3
                mov     Test1_WF[bx],1
Lab3:           add     bx,16
                mov     ax,Test2_Sel
                cmp     bx,32
                jb      Lab1
                ;准备返回实方式
                mov     ax,Normal_Sel
                mov     ds,ax
                mov     eax,cr0
                and     al,11111110b
                mov     cr0,eax                   ;返回实方式
                JUMP16  <SEG Real>,<OFFSET Real>
Virtual         ENDP
;----------------------------------------------------------------------------
TempCodeSeg     ENDS
;----------------------------------------------------------------------------
RCodeSeg        SEGMENT PARA USE16
                ASSUME  CS:RCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
VGDTR           PDesc   <GDTLen-1,>
;----------------------------------------------------------------------------
Start           PROC
                mov     ax,BufferSeg
                mov     ds,ax
                sgdt    GDTR_V
                sidt    IDTR_V
                smsw    MSW_V
                ;准备转入保护方式
                push    cs
                pop     ds
                cld
                call    InitGDT
                mov     bx,OFFSET VGDTR
                lgdt    [bx]
                cli
                mov     eax,cr0
                or      al,1
                ;转入保护方式
                mov     cr0,eax
                JUMP16  <TempCode_Sel>,<OFFSET Virtual>
Real:           ;回到实方式
                sti
                ;为了简单,略去了显示相关变量内容的部分代码
                mov     ax,4c00h
                int     21h
Start           ENDP
;----------------------------------------------------------------------------
InitGDT         PROC
                push    ds
                mov     ax,GDTSeg
                mov     ds,ax
                mov     cx,GDNum
                mov     si,OFFSET EFFGDT
InitG:          mov     ax,[si].BaseL
                movzx   eax,ax
                shl     eax,4
                shld    edx,eax,16
                mov     WORD PTR [si].BaseL,ax
                mov     BYTE PTR [si].BaseM,dl
                mov     BYTE PTR [si].BaseH,dh
                add     si,SIZE Desc
                loop    InitG
                pop     ds
                mov     bx,16
                mov     ax,GDTSeg
                mul     bx
                mov     WORD PTR VGDTR.Base,ax
                mov     WORD PTR VGDTR.Base+2,dx
                ret
InitGDT         ENDP
;----------------------------------------------------------------------------
RCodeSeg        ENDS
                END     Start
| 特 权 指 令  | 
指 令 | 功 能 | 指 令 | 功 能 | 
| CLTS | 清除CR0中的TS位 | LTR | 装入TR寄存器 | |
| HLT | 停机 | MOV CRn,reg | 装入控制寄存器 | |
| LGDT | 装入GDTR寄存器 | MOV reg,CRn | 保存控制寄存器 | |
| LIDT | 装入IDTR寄存器 | MOV DRn,reg | 装入调试寄存器 | |
| LLDT | 装入LDTR寄存器 | MOV reg,DRn | 保存调试寄存器 | |
| LMSW | 装入MSW寄存器(CR0的低16位) | 
| 参考资料 | 书 名 | 出 版 社 | 作 者 | 
| 《保护方式下的80386及其编程》 | 清华大学出版社 | 周明德主编 | |
| 《80X86汇编语言程序设计教程》 | 清华大学出版社 | 扬季文主编 |